package com.party.core.service.wechatPlatform.impl;

import com.google.common.base.Strings;
import com.party.common.paging.Page;
import com.party.core.dao.read.member.MemberExternalAppReadDao;
import com.party.core.dao.read.wechatPlatform.WechatOpenMemberReadDao;
import com.party.core.dao.write.wechatPlatform.WechatOpenMemberWriteDao;
import com.party.core.model.BaseModel;
import com.party.core.model.YesNoStatus;
import com.party.core.model.member.DeployType;
import com.party.core.model.member.MemberExternalApp;
import com.party.core.model.member.MemberGroup;
import com.party.core.model.wechatPlatform.WechatOpenMember;
import com.party.core.service.member.IMemberExternalAppService;
import com.party.core.service.member.IMemberGroupService;
import com.party.core.service.wechatPlatform.IWechatOpenMemberService;
import com.sun.istack.NotNull;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * @Author: Administrator.
 * @Description: 微信授权管理授权信息
 * @Date:Created in 2017/8/26 0026 下午 14:31.
 */
@Service
public class WechatOpenMemberService implements IWechatOpenMemberService {
    @Autowired
    private WechatOpenMemberReadDao wechatOpenMemberReadDao;

    @Autowired
    private WechatOpenMemberWriteDao wechatOpenMemberWriteDao;

    @Autowired
    private MemberExternalAppReadDao memberExternalAppReadDao;

    @Autowired
    private IMemberGroupService memberGroupService;

    @Autowired
    private IMemberExternalAppService memberExternalAppService;

    /**
     * 微信授权信息插入
     *
     * @param wechatOpenMember 微信授权信息
     * @return 插入结果（true/false）
     */
    @Override
    public String insert(WechatOpenMember wechatOpenMember) {
        BaseModel.preInsert(wechatOpenMember);
        boolean result = wechatOpenMemberWriteDao.insert(wechatOpenMember);
        if (result) {
            return wechatOpenMember.getId();
        }
        return null;
    }


    /**
     * 微信授权信息更新
     *
     * @param wechatOpenMember 微信授权信息
     * @return 更新结果（true/false）
     */
    @Override
    public boolean update(WechatOpenMember wechatOpenMember) {
        wechatOpenMember.setUpdateDate(new Date());
        return wechatOpenMemberWriteDao.update(wechatOpenMember);
    }


    /**
     * 微信授权信息逻辑删除
     *
     * @param id 实体主键
     * @return 删除结果（true/false）
     */
    @Override
    public boolean deleteLogic(@NotNull String id) {

        if (Strings.isNullOrEmpty(id)) {
            return false;
        }
        return wechatOpenMemberWriteDao.deleteLogic(id);
    }


    /**
     * 微信授权信息物理删除
     *
     * @param id 实体主键
     * @return 删除结果（true/false）
     */
    @Override
    public boolean delete(@NotNull String id) {

        if (Strings.isNullOrEmpty(id)) {
            return false;
        }
        return wechatOpenMemberWriteDao.delete(id);
    }


    /**
     * 微信授权信息逻辑批量删除
     *
     * @param ids 主键集合
     * @return 删除结果（true/false）
     */
    @Override
    public boolean batchDeleteLogic(@NotNull Set<String> ids) {

        if (CollectionUtils.isEmpty(ids)) {
            return false;
        }
        return wechatOpenMemberWriteDao.batchDeleteLogic(ids);
    }

    /**
     * 微信授权信息物理逻辑删除
     *
     * @param ids 主键集合
     * @return 删除结果（true/false）
     */
    @Override
    public boolean batchDelete(@NotNull Set<String> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return false;
        }
        return wechatOpenMemberWriteDao.batchDelete(ids);
    }


    /**
     * 根据主键获取微信授权信息
     *
     * @param id 主键
     * @return 微信授权信息
     */
    @Override
    public WechatOpenMember get(String id) {
        return wechatOpenMemberReadDao.get(id);
    }


    /**
     * 分页查询微信授权信息
     *
     * @param wechatOpenMember 微信授权信息
     * @param page             分页信息
     * @return 微信授权信息列表
     */
    @Override
    public List<WechatOpenMember> listPage(WechatOpenMember wechatOpenMember, Page page) {
        return wechatOpenMemberReadDao.listPage(wechatOpenMember, page);
    }

    /**
     * 查询所有微信授权信息
     *
     * @param wechatOpenMember
     * @return 微信授权信息列表
     */
    @Override
    public List<WechatOpenMember> list(WechatOpenMember wechatOpenMember) {
        return wechatOpenMemberReadDao.listPage(wechatOpenMember, null);
    }

    /**
     * 批量查询微信授权信息
     *
     * @param ids              主键集合
     * @param wechatOpenMember
     * @param page             分页信息
     * @return 微信授权信息列表
     */
    @Override
    public List<WechatOpenMember> batchList(@NotNull Set<String> ids, WechatOpenMember wechatOpenMember, Page page) {
        if (CollectionUtils.isEmpty(ids)) {
            return Collections.EMPTY_LIST;
        }
        return wechatOpenMemberReadDao.batchList(ids, new HashedMap(), page);
    }

    /**
     * 获取机构绑定的公众号信息
     * 如果机构id为子账号，则获取父账号的公众号信息
     *
     * @param memberId 机构id
     * @return
     * @author yifeng
     * @date 16:04 2019/9/19
     **/
    @Override
    public WechatOpenMember findByMemberId(String memberId) {
        MemberGroup member = memberGroupService.getPartner(memberId);
        if (null == member || YesNoStatus.NO.getCode().equals(member.getOpenStatus())) {
            return null;
        }
        MemberExternalApp memberExternalApp
                = memberExternalAppService.findByMemberIdAndDeployType(member.getId(), member.getDeployType());
        if (memberExternalApp == null) {
            return null;
        }
        WechatOpenMember wechatOpenMember = this.get(memberExternalApp.getExternalAccountId());
        return wechatOpenMember;
    }

    /**
     * 根据 appid 查询授权公众号
     * @param appid appid
     * @return 授权公众号
     */
    @Override
    public WechatOpenMember findByAppid(String appid) {
        WechatOpenMember wechatOpenMember = new WechatOpenMember();
        wechatOpenMember.setAuthorizerAppid(appid);
        List<WechatOpenMember> list = this.list(wechatOpenMember);
        if (!CollectionUtils.isEmpty(list)){
            return list.get(0);
        }
        return null;
    }


    /**
     * 会员是否授权
     * @param memberId 会员编号
     * @return 是否授权（true/false）
     */
    @Override
    public boolean isAuthorize(String memberId) {
        MemberExternalApp memberExternalApp
                = memberExternalAppReadDao.findByMemberIdAndDeployType(memberId,
                DeployType.AUTHORIZATION.getCode());
        if (null == memberExternalApp){
            return false;
        }
        return true;
    }

    /**
     * 获取系统配置
     *
     * @return 微信开放平台
     */
    @Override
    public WechatOpenMember getSystem() {
        return wechatOpenMemberReadDao.getSystem();
    }

    /**
     * 根据appid 和填写类型查询
     * @param appId appid
     * @param deployType 填写配置
     * @return 微信账号信息
     */
    @Override
    public WechatOpenMember findByAppidAndDeployType(@NotNull String appId,@NotNull Integer deployType) {
        if (Strings.isNullOrEmpty(appId) || null == deployType){
            return null;
        }
        return wechatOpenMemberReadDao.findByAppidAndDeployType(appId, deployType);
    }

    public List<WechatOpenMember> listNoRelation(Integer deployType, String memberId) {
        return wechatOpenMemberReadDao.listNoRelation(deployType, memberId);
    }

    @Override
    public WechatOpenMember findByType(String type) {
        return wechatOpenMemberReadDao.findByType(type);
    }

    @Override
    public WechatOpenMember getByMemberIdAndDeployType(String memberId, Integer deployType) {
        return wechatOpenMemberReadDao.getByMemberIdAndDeployType(memberId,deployType);
    }
}
